//////////////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2014-present, Egret Technology.
//  All rights reserved.
//  Redistribution and use in source and binary forms, with or without
//  modification, are permitted provided that the following conditions are met:
//
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer in the
//       documentation and/or other materials provided with the distribution.
//     * Neither the name of the Egret nor the
//       names of its contributors may be used to endorse or promote products
//       derived from this software without specific prior written permission.
//
//  THIS SOFTWARE IS PROVIDED BY EGRET AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
//  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
//  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
//  IN NO EVENT SHALL EGRET AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA,
//  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//////////////////////////////////////////////////////////////////////////////////////

class Main extends egret.DisplayObjectContainer {

    public constructor() {
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
    }

    private onResize(): void {
        //App.ControllerManager.applyFunc(ControllerConst.RpgGame, RpgGameConst.GameResize);
    }

    private onAddToStage(event: egret.Event) {

        egret.lifecycle.addLifecycleListener((context) => {
            // custom lifecycle plugin
            context.onUpdate = () => {
            }
        })

        egret.lifecycle.onPause = () => {
            egret.ticker.pause();
        }

        egret.lifecycle.onResume = () => {
            egret.ticker.resume();
        }

        this.runGame().catch(e => {
            console.log(e);
        })
    }

    private async runGame() {
        this.removeEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
        egret.registerImplementation("eui.IAssetAdapter", new AssetAdapter());
        egret.registerImplementation("eui.IThemeAdapter", new ThemeAdapter());

/*
        App.StageUtils.getStage().scaleMode = egret.StageScaleMode.SHOW_ALL;
        //App.StageUtils.getStage().orientation = egret.OrientationMode.PORTRAIT;
        App.StageUtils.getStage().orientation = egret.OrientationMode.LANDSCAPE
        App.StageUtils.startFullscreenAdaptation(736, 414, this.onResize)
*/

        App.ResourceUtils.addConfig("resource/default.res.json", "resource/");
        //App.ResourceUtils.addConfig("resource/resource_core.json", "resource/");
        App.ResourceUtils.loadConfig(this.onConfigComplete, this);
        /*
                await this.loadResource()
                this.createGameScene();
                const result = await RES.getResAsync("description_json")
                this.startAnimation(result);
                await platform.login();
                const userInfo = await platform.getUserInfo();
                console.log(userInfo);
        */
    }
    private onConfigComplete(): void {
        App.ResourceUtils.loadGroup("preload", this.onResourceLoadComplete, this.onResourceLoadProgress, this)

    }

    private initScene(): void {
        //App.SceneManager.register(SceneConsts.LOADING, new LoadingScene());
        App.SceneManager.register(SceneConsts.GAME, new GameScene())
        App.SceneManager.register(SceneConsts.TEST, new TestScene())
        App.SceneManager.register(SceneConsts.FartMonkey, new FartMonkeyScene())
        App.SceneManager.register(SceneConsts.Tarzan, new TarzanScene())
    }

    private initModule(): void {
        App.ControllerManager.register(ControllerConsts.GameMap, new GameMapController());
        // App.ControllerManager.register(ControllerConsts.Game, new GameUIController());
    }

    private onResourceLoadComplete(param1: any, param2: any): void {
        this.initScene();
        this.initModule();
        //App.SceneManager.runScene(SceneConsts.LOADING);

        if (this.stage == App.StageUtils.getStage()) {
            //let sp = new egret.Bitmap()
            //sp.texture = RES.getRes("bg_png")
            //let l1 = new GameMapView(null, LayerManager.Game_Bg)
            //l1.addChild(sp)
            //App.StageUtils.getStage().addChild(LayerManager.Game_Bg)
            //console.log("Stage对了")
        }
        let app = new MyApp();
    }

    private onResourceLoadProgress(itemsLoaded: number, itemsTotal: number): void {
        //App.ControllerManager.applyFunc(ControllerConsts.Loading, LoadingConst.SetProgress, itemsLoaded, itemsTotal);
    }


    private async loadResource() {
        try {
            const loadingView = new LoadingUI();
            this.stage.addChild(loadingView);
            await RES.loadConfig("resource/default.res.json", "resource/");
            await RES.loadGroup("preload", 0, loadingView);
            this.stage.removeChild(loadingView);
        }
        catch (e) {
            console.error(e);
        }
    }
}